/**
 *  fairy 版权所有 Copyright@2016年3月18日
 */
package com.fairy.core.encrypt;

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/**
 * [DES.java]
 *
 * @ProjectName: [fairy_core]
 * @Author: [waysun]
 * @CreateDate: [2016年3月18日 下午3:58:38]
 * @Update: [说明本次修改内容] BY [waysun] [2016年3月18日 下午3:58:38]
 * @Version: [v1.0]
 */

public class DES {
	/** 
     * DES算法密钥 
     */  
    //private static final byte[] DES_KEY = { 21, 1, -110, 82, -32, -85, -128, -65 };  
	/** 
     * 数据加密，算法（DES） 
     * 
     * @param data 
     *            要进行加密的数据 
     * @return 加密后的数据 
     */  

	public static String encryptBasedDes(String data,String secretKey) {  
        String encryptedData = null;  
        try {  
            // DES算法要求有一个可信任的随机数源  
            SecureRandom sr = new SecureRandom();  
            byte[] DES_KEY=secretKey.getBytes("utf-8");
            DESKeySpec deskey = new DESKeySpec(DES_KEY);  
            // 创建一个密匙工厂，然后用它把DESKeySpec转换成一个SecretKey对象  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            SecretKey key = keyFactory.generateSecret(deskey);  
            // 加密对象  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.ENCRYPT_MODE, key, sr);  
            // 加密，并把字节数组编码成字符串 
            encryptedData=Base64Util.encodeByte(cipher.doFinal(data.getBytes()));
            //encryptedData = new sun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes()));  
        } catch (Exception e) {  
//            log.error("加密错误，错误信息：", e);  
            throw new RuntimeException("加密错误，错误信息：", e);  
        }  
        return encryptedData;  
    }  
    
    /** 
     * 数据解密，算法（DES） 
     * 
     * @param cryptData 
     *            加密数据 
     * @return 解密后的数据 
     */  
    @SuppressWarnings("restriction")
	public static String decryptBasedDes(String cryptData,String secretKey) {  
        String decryptedData = null;  
        try {  
            // DES算法要求有一个可信任的随机数源  
            SecureRandom sr = new SecureRandom();  
            byte[] DES_KEY=secretKey.getBytes("utf-8");
            DESKeySpec deskey = new DESKeySpec(DES_KEY);  
            // 创建一个密匙工厂，然后用它把DESKeySpec转换成一个SecretKey对象  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            SecretKey key = keyFactory.generateSecret(deskey);  
            // 解密对象  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.DECRYPT_MODE, key, sr);  
            // 把字符串解码为字节数组，并解密  
            decryptedData = new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(cryptData)));  
        } catch (Exception e) {  
//            log.error("解密错误，错误信息：", e);  
            throw new RuntimeException("解密错误，错误信息：", e);  
        }  
        return decryptedData;  
    }  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
          
        String str="中华人民共和国";
        String secretKey="acbccceee";
  
        // DES数据加密  
        String s1=encryptBasedDes(str,secretKey);  
          
        System.out.println(s1);  
          
        // DES数据解密  
        String s2=decryptBasedDes(s1,secretKey);  
          
        System.err.println(s2);  
          
          
    }  
}



